package J11_15;


//题目描述
//给出一个𝑛(1 ≤ 𝑛 ≤ 103 )个点，𝑚(1 ≤ 𝑚 ≤ 104)条边的无向图，可能存在自环与重边。 删除图中的𝑞(1 ≤ 𝑞 ≤ 𝑚)条边，保证每条边至多只被删除一次， 每次删除一条边后输出图中还有几个连通块。
//连通块的定义是一个点的集合中任意两点
//输入描述:
//第一行包括两个正整数𝑛(1 ≤ 𝑛 ≤ 103 )，𝑚(1 ≤ 𝑚 ≤  104 )，分别表示无向图的点数与边数接下来的𝑚行每行包括两个正整数
// 𝑢𝑖 (1 ≤ 𝑢𝑖 ≤ 𝑛), 𝑣𝑖 (1 ≤ 𝑣𝑖 ≤ 𝑛) 表示第𝑖条边连接的两个点第𝑚 + 2行包括一个正整数𝑞(1 ≤ 𝑞 ≤ 𝑚)，表示删除的边的数量。
// 接下来的𝑞行每行包括一个正整数𝑖𝑑(1 ≤ 𝑖𝑑 ≤ 𝑚)，表示删除的边是第𝑖𝑑条边。
//输出描述:
//对于每次删除，输出这条边被删除后图中连通块的个数，用换行分隔。
/*示例1
        输入
        5 5
        1 2
        2 3
        3 4
        1 4
        5 3
        3
        3
        1
        5
        输出
        1
        2
        3*/

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        List<int[]> edges = new ArrayList<>();
        for (int i = 0; i < m; i++) {
            int u = scanner.nextInt();
            int v = scanner.nextInt();
            edges.add(new int[]{u, v});
        }
        int q = scanner.nextInt();
        int[] deleted = new int[q];
        for (int i = 0; i < q; i++) {
            deleted[i] = scanner.nextInt();
        }
        List<Integer> result = solve(n, m, edges, q, deleted);
        for (int r : result) {
            System.out.println(r);
        }
    }

    public static List<Integer> solve(int n, int m, List<int[]> edges, int q, int[] deleted) {
        UnionFind uf = new UnionFind(n);
        List<Integer> result = new ArrayList<>();

        // 遍历所有的边，进行合并
        for (int[] edge : edges) {
            int u = edge[0];
            int v = edge[1];
            uf.union(u, v);
        }

        // 处理删除操作
        for (int idx : deleted) {
            int[] edge = edges.get(idx - 1);
            int u = edge[0];
            int v = edge[1];
            // 判断边两个端点是否在同一个连通块中
            if (uf.find(u) == uf.find(v)) {
                result.add(uf.getCount()); // 删除边后不改变连通性
                continue;
            }

            // 分离边两个端点所在的连通块
            uf.union(u, u); // 将其中一个点的父节点设为自己
            result.add(uf.getCount());
        }

        return result;
    }


}
